package mytest;

import net.bytebuddy.ByteBuddy;
import net.bytebuddy.implementation.FixedValue;
import net.bytebuddy.matcher.ElementMatchers;



public class ByteBuddyExample {
    public static void main(String[] args) throws Exception {

//        // 示例1：动态创建一个类，并重写 toString()
//        Class<?> dynamicType = new ByteBuddy()
//                .subclass(Object.class)
//                .name("com.example.DynamicType")
//                .method(ElementMatchers.named("toString"))
//                .intercept(FixedValue.value("Hello from Byte Buddy!"))
//                .make()
//                .load(ByteBuddyExample.class.getClassLoader())
//                .getLoaded();
//
//        Object instance = dynamicType.getDeclaredConstructor().newInstance();
//        System.out.println(instance.toString()); // 输出: Hello from Byte Buddy!
//
//
//        // 示例2：增强一个自定义类的方法（替换 length() 返回值）
//
//        // 定义一个可被增强的简单类
//        Class<?> enhancedType = new ByteBuddy()
//                .subclass(MyCustomClass.class) // 使用自定义类代替 String
//                .method(ElementMatchers.named("length"))
//                .intercept(FixedValue.value(42))
//                .make()
//                .load(ByteBuddyExample.class.getClassLoader())
//                .getLoaded();
//
//        MyCustomClass enhancedInstance = (MyCustomClass) enhancedType.getDeclaredConstructor().newInstance();
//        System.out.println(enhancedInstance.length()); // 输出: 42
//    }
//
//    // 自定义类用于增强测试
//    public static class MyCustomClass {
//        public int length() {
//            return "default".length(); // 默认实现
//        }
        Class<?> onePunch = new ByteBuddy()
                .subclass(Object.class)
                .name("com.example.OnePunch")
                .method(ElementMatchers.named("toString"))
                .intercept(FixedValue.value("One Punch"))
                .make()
                .load(ByteBuddyExample.class.getClassLoader())
                .getLoaded();

        Object instance = onePunch.getDeclaredConstructor().newInstance();
        System.out.println(instance.toString());
    }
}
